perm filename MKCON.FAI[C,BGB] blob sn#101491 filedate 1974-05-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00022 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00004 00002	TITLE MKCON - MAKE CONTOUR IMAGE - APRIL 1973 - B. G. BAUMGART.
C00005 00003	SUBR(MKCON)Q1,Q2.	MAKE: CONTOUR IMAGE FROM VIDEO.
C00007 00004	  SUBRS:		MAKE: MKIMAG(FILM). MKLEVL(IMAGE,CUT).
C00009 00005	  SUBRS:		MAKE: THRESH(CUT). PAXOR.
C00011 00006	SUBR(MKPGON)LEVEL	MAKE: POLYGON BY TRACING BIT RASTER BLOB.
C00013 00007				MAKE: MKPGON SUB-OPERATIONS.
C00014 00008				MAKE: THE ALCHEMIST OF MKPGON.
C00017 00009	SUBR(VICONT)LEVEL	CONTRAST: VECTOR INTENSITY CONTRAST.
C00020 00010				CONTRAST: VICONT CONTINUED.
C00023 00011	SUBR(ARCONT)LEVEL	CONTRAST: ARC CONTRAST.
C00025 00012	SUBR(MKSKY)LEVEL	NESTING: MAKE BORDER POLYGON & SKY ARRAY.
C00028 00013	  SUBRS:		NESTING: MKTREE,ATTACH,DETACH
C00031 00014	SUBR(INTREE)P1.		NESTING: PUT POLYGON INTO THE TREE.
C00033 00015				NESTING: INTREE CONTINUED.
C00035 00016	SUBR(INSKY)PGON		NESTING: PUT A POLYGON IN THE SKY ARRAY.
C00037 00017	SUBR(KILVIC)LEVEL.	KILL: CONTOURS OF THE PREVIOUS LEVEL.
C00038 00018	SUBR(KLBABY)LEVEL	KILL: BABY POLYGONS OF A LEVEL.
C00040 00019	SUBR(KLPGON)PGN		KILL: POLYGON AND RETURN CCW(PGN).
C00042 00020	SUBR(SMOOTH)LEVEL	SMOOTH: CONTOURS INTO ARCS.
C00044 00021	MKARCS(V1,V2).		SMOOTH: MAKE ARCS FROM V1 CCW TO V2.
C00047 00022	SUBR(HISTOG)		MISC: MAKE HISTOGRAM OF TVBUF.
C00048 ENDMK
C⊗;
TITLE MKCON - MAKE CONTOUR IMAGE - APRIL 1973 - B. G. BAUMGART.

	EXTERN PUTSKY,GETSKY
	EXTERN FLGHIS,ARCWID,CTRL,META
	EXTERN PAC,STADPY,TVBUF
	EXTERN HISTO,HSEG,VSEG,FILM
	EXTERN ROWPTR,COLPTR,DPYIMG
	EXTERN MKNODE,KLNODE,RINGIN
	EXTERN SQRT

	DECLARE{IMAGE,LEVEL,POLYGON}

;ENABLE SUBROUTINE FLAGS.
	INTERN ENEST,ECONT,ESMOO,ECOMP
	ENEST:-1	;POLYGON NESTING.
	ECONT:-1	;VECTOR AND ARC CONTRAST.
	ESMOO:-1	;MAKE ARC SMOOTHING.
	ECOMP:-1	;IMAGE COMPARING.
SUBR(MKCON)Q1,Q2.	MAKE: CONTOUR IMAGE FROM VIDEO.
BEGIN MKCON;---------------------------------------------------

;BIT POSITIONS OF THE ARGUMENTS Q1 & Q2 ENABLE INTENSITY CUTS.
	LAC 1,ARG2↔DAC 1,Q0
	LAC 1,ARG1↔ANDCMI 1,377↔DAC 1,Q1
	DZM CUT#

;MAKE THE IMAGE BLOCK AND THE LEVEL -1 FRAME POLYGON.
	SETQ IMAGE,{MKIMAG,FILM}
	SETQ LEVEL,{MKLEVL,IMAGE,[-1]}
	SETQ POLYGON,{MKSKY,LEVEL}	;BORDER & SKY.

;FIND AN INTENSITY CONTOUR ENABLE BIT.
L0:	LAC 0,Q0↔LAC 1,Q1
L1:	AOS 2,CUT↔LSHC 0,1↔JUMPL 0,L2
	CAMN 0,1↔JUMPE 0,L5↔GO L1

;THRESHOLD THE TVBUF
L2:	DAC 0,Q0↔DAC 1,Q1
	CALL(THRESH,CUT)
	CALL(PACXOR)

;MAKE LEVEL NODE WITH A RING OF POLYGON NODES.
	SETQ(LEVEL,{MKLEVL,IMAGE,CUT})
L3:	SETQ(POLYGON,{MKPGON,LEVEL})
	JUMPN 1,L3↔LAC 1,LEVEL↔SON 1,1↔JUMPE 1,L0

;LEVEL OPERATIONS.
L4:	CALL(VICONT,LEVEL)
	CALL(KLBABY,LEVEL)
	CALL(SMOOTH,LEVEL)
	CALL(ARCONT,LEVEL)
	CALL(MKTREE,LEVEL)
	CALL(KILVIC,LEVEL)
	CALL(STADPY)
	GO L0

;LAGGING LEVEL OPERATIONS.
L5:	LAC 1,LEVEL↔CCW 1,1↔DAC 1,LEVEL
	CALL(KILVIC,LEVEL)
	LAC 1,IMAGE↔POP2J

	DECLARE{Q0,Q1}
BEND MKCON; BGB 6 DECEMBER 1972 ----------------------------------
;  SUBRS:		MAKE: MKIMAG(FILM). MKLEVL(IMAGE,CUT).
SUBR(MKIMAG)FILM--------------------------------------------------
BEGIN MKIMAG; MAKE IMAGE NODE - BGB - 10 JANUARY 1973.
	EXTERN QIMAGE
	SETQ(IMAGE,{MKNODE,[IBIT+IMGREL]})
	CALL(RINGIN,IMAGE,FILM)
	LAC 1,IMAGE↔CW 2,1		;PREVIOUS IMAGE.
	NCNT 2,2↔AOS 2↔NCNT. 2,1	;IMAGE SEQUENCE NUMBER.
	DAC 1,QIMAGE
	LAC TVTIME↑↔DAC 3(1)
	POP1J
BEND;1/10/73------------------------------------------------------

SUBR(MKLEVL)IMAGE,CUT---------------------------------------------
BEGIN MKLEVL; MAKE LEVEL NODE - BGB - 10 JANUARY 1973.
	SETQ(LEVEL,{MKNODE,[LBIT+LVLREL]})
	CALL(RINGIN,LEVEL,IMAGE)
	LAC 1,LEVEL↔LAC 2,ARG2
	LAC 0,ARG1↔NCNT. 0,1
	POP2J
BEND;1/10/73------------------------------------------------------
;  SUBRS:		MAKE: THRESH(CUT). PAXOR.
SUBR(THRESH)------------------------------------------------------
BEGIN THRESH
;SOUTH TO PAC FOR PIXELS ≥ CUT.
	I←13 ↔ J←14
	LAC [XWD L,2]↔BLT 13
	LAP 5,ARG1
	GO 3

;ACCUMULATOR LOOP.
L:	POINT 6,TVBUF,-1
	MOVEI J,=36	;3
	ILDB 2		;4
	SUBI ;CUT	;5
	ROTC 1		;6
	SOJG J,4	;7
	SETCAM 1,PAC(I) ;10
	AOBJN I,3	;11
	POP1J		;12
	XWD -=1728,0	;13
BEND THRESH;BGB 4 DECEMBER 1972 ----------------------------------


;PACXOR.		ROOK'S MOVE XOR'ING ON 1-BIT IMAGE.
SUBR(PACXOR)------------------------------------------------------
BEGIN PACXOR
	I←2
	SLACI PAC↔LAPI HSEG↔BLT HSEG+=1727
	SLACI PAC↔LAPI VSEG↔BLT VSEG+=1727
	SETZ I,
	HRRI PAC↔DAP L+2
L:	TRNN I,7↔SETZ 1,↔LAC PAC(I)
	XORM HSEG+8(I)		;HSEG's are above PAC bits.
	ROTC -1↔ROT 1,1
	XORM VSEG(I)		;VSEG's are left of PAC bits.
	AOS I
	CAIE I,=1728
	GO L
	POP0J
BEND PACXOR; BGB 4 DECEMBER 1972 ---------------------------------
SUBR(MKPGON)LEVEL	MAKE: POLYGON BY TRACING BIT RASTER BLOB.
BEGIN MKPGON;------------------------------------------------------

	ACCUMULATORS{A2,A3,RC.,MASK,I,PTR,D,E,V,PG,BITQ,H1,H2}
	LAC 1,ARG1↔NCNT H1,1↔LSH H1,-3
	LACI H2,7↔SUB H2,H1
	LAC I,ISAVED#↔CDR PTR,ARG1↔LACI BITQ,VREL
	SLACI I↔HRRI PAC↔DAC PACPTR#; PAC POINTER INDEXED BY I.

;FIND THE ROW & COL OF THE UPPER LEFT MOST VSEG.
L1:	SKIPE 1,VSEG(I)↔GO L2
	AOS I↔CAIE I,=1728↔GO L1
	SETZB 1,ISAVED#↔POP1J		;PAC IS NOW EMPTY.

L2:	DAC I,ISAVED↔JFFO 1,.+1↔SLACI MASK,400000
	MOVNS 2↔LSH MASK,(2)↔MOVNS 2
	LAC RC.,I↔ANDI RC.,7↔IMULI RC.,=36↔ADD RC.,2	;COLUMN.
	LAC I↔LSH -3↔DIP RC.↔LSH RC.,6			;ROW.

;DISTINGUISH BLOBS FROM HOLES.
	DZM HOLE#
	TDNN MASK,@PACPTR		;HOLE OR BLOB ?
	SETOM HOLE#			;HOLE'A'COMING.
	SKIPE HOLE↔EXCH H1,H2

;AND HEAD SOUTH.

	SETQ(PG,{MKNODE,[PBIT+PGNREL]})
	LAC 0,ARG1↔DAD. 0,PG↔CALL(RINGIN,PG,0)
	SKIPE HOLE↔GO[MARK PG,HOLBIT↔GO .+1]
	DAC  RC.,RCMIN#
	DZM RCMAX#
	SETZ V,↔DZM ECNT#
	PUSHJ P,FOLLOW
	LAC V,V0
	CCW. V,E↔CW. E,V

;MAKE & RETURN VIC POLYGON.

	LAC 1,ECNT↔SKIPE HOLE#↔MOVNS 1
 	NCNT. 1,PG
	LAC V0↔SON. 0,PG	;UPPER MOST LEFT.
	LAC V1↔ARC. 0,PG	;LOWER MOST RIGHT.
	LAC 1,PG
L3:	POP1J
;			MAKE: MKPGON SUB-OPERATIONS.

DEFINE	TRY (SEG,YES) {
	LAC SEG(I)↔TDZN MASK↔GO .+3↔DAC SEG(I)↔GO YES}
DEFINE	LEFT	{SUBI RC.,100↔ROT MASK,1↔CAIN MASK,1↔SOS I}
DEFINE	RIGHT	{ADDI RC.,100↔ROT MASK,-1↔SKIPG MASK↔AOS I}
DEFINE	UP 	{SUB RC.,[1B11]↔SUBI I,8}
DEFINE	DOWN  	{ADD RC.,[1B11]↔ADDI I,8}

;CREATE NEW EDGE AND VERTEX OF A VIC.
TURN:	0
	AOS TURNS#
	ADD D,RC.
	AOS 2,ECNT

;VERTEX
	CALL(MKNODE,BITQ)
	DAD. PG,1
	SKIPN V↔GO[DAC 1,V0#↔DAC 1,V↔GO T2]
	DAC 1,V
	CCW. V,E↔CW. E,V
T2:	DAC D,RC(V)
	CAMLE D,RCMAX
	GO[DAC D,RCMAX↔DAC V,V1#↔GO .+1]
	DAC V,E
	GO @TURN
;			MAKE: THE ALCHEMIST OF MKPGON.
	;converts bits of lead into lines of gold.

NORTH:	ADD D,[1B11]↔LIPI BITQ,(NORBIT+VBIT)↔JSR TURN
NORTH2:	LEFT↔LAC D,DELPM(H1)↔TRY HSEG,WEST
	RIGHT↔UP↔TRY VSEG,NORTH2
	DOWN↔LAC D,DELPP(H2)↔TRY HSEG,EAST↔FATAL(NORTH)
NORTH3:	LIPI BITQ,(NORBIT+VBIT)↔JSR TURN↔LEFT
NORTH4:	UP↔LAC D,DELPM(H1)↔TRY HSEG,WEST↔GO NORTH4


WEST:	ADDI D,100↔LIPI BITQ,(WESBIT+VBIT)↔JSR TURN
WEST2:	CAMN RC.,RCMIN↔POPJ P,
FOLLOW:	LAC D,DELPP(H1)↔TRY VSEG,SOUTH
	LEFT↔TRY HSEG,WEST2
	RIGHT↔UP↔LAC D,DELMP(H2)↔TRY VSEG,NORTH↔FATAL(WEST)


SOUTH:	LIPI BITQ,(SOUBIT+VBIT)↔JSR TURN
SOUTH2:	DOWN↔LAC D,DELMP(H1)
	CAR RC.↔CAIN =216B29↔GO EAST3
	TRY HSEG, EAST↔TRY VSEG,SOUTH2
	LEFT↔LAC D,DELMM(H2)↔TRY HSEG,WEST↔FATAL(SOUTH)


EAST:	LIPI BITQ,(EASBIT+VBIT)↔JSR TURN
EAST2:	RIGHT↔LAC D,DELMM(H1)
	CDR RC.↔CAIN =288B29↔GO NORTH3
	UP↔TRY VSEG,NORTH
	DOWN↔TRY HSEG,EAST2
	LAC D,DELPM(H2)↔TRY VSEG,SOUTH↔FATAL(EAST)
EAST3:	LIPI BITQ,(EASBIT+VBIT)↔JSR TURN↔UP
EAST4:	RIGHT↔LAC D,DELMM(H1)
	CDR RC.↔CAIN =288B29↔GO[DOWN↔GO NORTH3]
	TRY VSEG,NORTH↔GO EAST4

;DEKINKING OFF SETS.

	DELPP:	FOR I←24,33{XWD I,I↔}
	DELPM:	FOR I←24,33{XWD I,-I↔}
	DELMP:	FOR I←24,33{XWD -I,I↔}
	DELMM:	FOR I←24,33{XWD -I,-I↔}


BEND MKPGON;BGB AUGUST 1972 ---------------------------------------
SUBR(VICONT)LEVEL	CONTRAST: VECTOR INTENSITY CONTRAST.
COMMENT ⊗
The contrast of a vector is defined  as (QUOTIENT (DIFFERENCE (Sum of
pixel values  on one side of the vector) (Sum  of pixel values on the
other side of the vector)) (length of the vector in  pixels)). Since,
vectors  are always  either  horizontal or  vertical,  there are  two
inner  most  loops.  For horizontal  vectors  two  byte  pointers are
incremented up core west to east a row apart thru  the TVBUF. For the
vertical vectors  one byte pointer is saved  then LDB'ed and ILDB'ed,
and then is restored and bumped a row by the code at line NSL:
⊗;

BEGIN VICONT;--------------------------------------------------------
	ACCUMULATORS{R1,C1,V1,R2,C2,V2,PG,SUM1,SUM2,CNT,PTR,SAVCNT}
	SKIPN ECONT↔POP1J
	LAC 1,ARG1↔SON PG,1↔DAC PG,PG0#		;FIRST POLYGON.
L1:	SON V2,PG↔DAC V2,V0#			;FIRST VECTOR.
	ROW R2,V2↔ADDI R2,40↔LSH R2,-6
	COL C2,V2↔ADDI C2,40↔LSH C2,-6

L2:	LAC V1,V2↔LAC R1,R2↔LAC C1,C2↔CCW V2,V2	;NEXT VECTOR.
	ROW R2,V2↔ADDI R2,40↔LSH R2,-6
	COL C2,V2↔ADDI C2,40↔LSH C2,-6
	SETZB SUM1,SUM2
	TESTZ V1,WESBIT↔GO WEST
	TESTZ V1,SOUBIT↔GO SOUTH
	TESTZ V1,EASBIT↔GO EAST
	TESTZ V1,NORBIT↔GO NORTH↔HALT
L3:	CAME V2,V0↔GO L2↔CCW PG,PG	;NEXT POLYGON.
	CAME PG,PG0↔GO L1↔POP1J		;EXIT.
;-----------------------------------------------------------------
;			CONTRAST: VICONT CONTINUED.
WEST:	LAC ROWPTR(R2)↔ADD COLPTR-1(C2)↔TLZ 1
	LAC CNT,C1↔SUB CNT,C2↔CALL(EW)		;CNT ← C1-C2
	SUB SUM2,SUM1
	NTIME. SUM2,V1↔PTIME. SAVCNT,V1
	IDIV SUM2,SAVCNT
	CNTRS. SUM2,V1↔GO L3
SOUTH:	LAC ROWPTR(R1)↔ADD COLPTR-1(C1)↔TLZ 1
	LAC CNT,R2↔SUB CNT,R1↔CALL(NS)		;CNT ← R2-R1
	SUB SUM2,SUM1
	NTIME. SUM2,V1↔PTIME. SAVCNT,V1
	IDIV SUM2,SAVCNT
	CNTRS. SUM2,V1↔GO L3
EAST: 	LAC ROWPTR(R1)↔ADD COLPTR-1(C1)↔TLZ 1
	LAC CNT,C2↔SUB CNT,C1↔CALL(EW)		;CNT ← C2-C1
	SUB SUM1,SUM2
	NTIME. SUM1,V1↔PTIME. SAVCNT,V1
	IDIV SUM1,SAVCNT
	CNTRS. SUM1,V1↔GO L3
NORTH:	LAC ROWPTR(R2)↔ADD COLPTR-1(C2)↔TLZ 1
	LAC CNT,R1↔SUB CNT,R2↔CALL(NS)		;CNT ← R1-R2
	SUB SUM1,SUM2
	NTIME. SUM1,V1↔PTIME. SAVCNT,V1
	IDIV SUM1,SAVCNT
	CNTRS. SUM1,V1↔GO L3
	DECLARE{PTRNW,PTRSE}
;-----------------------------------------------------------------
;EAST-WEST HORIZONAL VECTORS.
EW:	DAC CNT,SAVCNT
	DAC PTRSE
	SUBI =48↔DAC PTRNW
EWL:	ILDB PTRNW↔ADDM SUM1
	ILDB PTRSE↔ADDM SUM2
	SOJG CNT,EWL

	CAIG R1,0↔SETZ SUM1,
	CAIL R1,=216↔SETZ SUM2,
	POP0J

;NORTH-SOUTH VERTICAL VECTORS.
NS:	DAC CNT,SAVCNT↔DAC PTR↔TDCA 1,1

NSL:	LACI 1,=48↔ADDB 1,PTR
	 LDB 1↔ADDM SUM1
	ILDB 1↔ADDM SUM2
	SOJG CNT,NSL
	CAIG  C1,0↔SETZ SUM1,
	CAIL  C1,=288↔SETZ SUM2,↔POP0J
BEND VICONT; BGB 14 DECEMBER 1972 --------------------------------
SUBR(ARCONT)LEVEL	CONTRAST: ARC CONTRAST.
BEGIN ARCONT;-----------------------------------------------------
	ACCUMULATORS{QNS,QEW,A1,A2,V1,V2,PG,PG0,A0,NS,EW}
	SKIPN ECONT↔POP1J↔SKIPN ESMOO↔POP1J
;FOR ALL THE ARCS OF THIS LEVEL.
	LAC 1,ARG1
	SON PG,1↔DAC PG,PG0	;FIRST POLYGON.
L1:	ARC A2,PG↔DAC A2,A0	;FIRST ARC.
L2:	LAC A1,A2↔SON V1,A1
	CCW A2,A1↔SON V2,A2

;ACCUMULATE VECTOR CONTRAST,,LENGTH ALONG THE ARC.
	SETZB QNS,QEW
	SETZB NS,EW
L3:	TESTZ V1,NORBIT+SOUBIT↔GO[
	NIP 6(V1)↔ADDM QNS
	NAP 6(V1)↔ADDM  NS↔GO .+5]
	NIP 6(V1)↔ADDM QEW
	NAP 6(V1)↔ADDM  EW
	DZM 6(V1)↔↔CCW V1,V1
	CAME V1,V2↔GO L3

;COMPUTE ARC CONTRAST:  SIN*VERTICAL + COS*HORIZONTAL.
L5:	FSC NS,233↔FSC QNS,233↔FDVR QNS,NS
	HLLZ 1,6(A1)↔FMPR QNS,1

	FSC EW,233↔FSC QEW,233↔FDVR QEW,EW
	HRLZ 1,6(A1)↔FMPR 1,QEW↔FADR 1,QNS

	FIX 1,233000↔CNTRS. 1,A1↔DZM 6(A1)

	CAME A2,A0↔GO L2	;LAST ARC OF THE POLYGON ?
	CCW PG,PG
	CAME PG,PG0↔GO L1	;LAST POLYGON OF THE LEVEL ?
	POP1J
BEND ARCONT; 21 JANUARY 1973 -------------------------------------
SUBR(MKSKY)LEVEL	NESTING: MAKE BORDER POLYGON & SKY ARRAY.
BEGIN MKSKY;------------------------------------------------------

	ACCUMULATORS{R,C,N,S,E,W,M,LVL}

;MAIN BORDER POLYGON.
	SETQ(M,{MKNODE,[PBIT+PGNREL]})
	LAC LVL,ARG1↔DAD. LVL,1
	CALL(RINGIN,M,LVL)
	LACI R,=216⊗6↔LACI C,=288⊗6

;VERTEX-POLYGON POLYGON.
	SETQ(W,{MKNODE,[VBIT+SOUBIT+VREL]})↔DAD. M,W
	SETQ(S,{MKNODE,[VBIT+EASBIT+VREL]})↔DAD. M,S
	SETQ(E,{MKNODE,[VBIT+NORBIT+VREL]})↔DAD. M,E
	SETQ(N,{MKNODE,[VBIT+WESBIT+VREL]})↔DAD. M,N
	ROW. R,S↔ROW. R,E↔COL. C,E↔COL. C,N
	CW.  N,W ↔ CW.  E,N ↔ CW.  S,E ↔ CW.  W,S
	CCW. S,W ↔ CCW. E,S ↔ CCW. N,E ↔ CCW. W,N
	SON. W,M↔LAC 1,M


;PUT THE BORDER POLYGON UP IN THE SKY.
	CDR GETSKY↔DZM@↔DIP↔AOS
	CDR 1,GETSKY↔BLT =31500-1(1)
	SETZ C,↔LACI R,=216↔LAC W
	XCT PUTSKY(R)↔SOJGE R,.-1
	LACI R,=216↔LACI C,=288↔LAC E
	XCT PUTSKY(R)↔SOJGE R,.-1

;ARC BORDER POLYGON.
	LACI R,=216⊗6↔LACI C,=288⊗6
	CALL(MKNODE,[ARCBIT+VBIT+VREL])↔SON. 1,W↔SON. W,1↔LAC W,1
	CALL(MKNODE,[ARCBIT+VBIT+VREL])↔SON. 1,S↔SON. S,1↔LAC S,1
	CALL(MKNODE,[ARCBIT+VBIT+VREL])↔SON. 1,E↔SON. E,1↔LAC E,1
	CALL(MKNODE,[ARCBIT+VBIT+VREL])↔SON. 1,N↔SON. N,1↔LAC N,1
	ROW. R,S↔ROW. R,E↔COL. C,E↔COL. C,N
	DAD. M,W↔DAD. M,S↔DAD. M,E↔DAD. M,N
	CW.  N,W ↔ CW.  E,N ↔ CW.  S,E ↔ CW.  W,S
	CCW. S,W ↔ CCW. E,S ↔ CCW. N,E ↔ CCW. W,N
	ARC. W,M↔LAC 1,M↔POP1J
BEND MKSKY; BGB 4 DECEMBER 1972 ----------------------------------
;  SUBRS:		NESTING: MKTREE,ATTACH,DETACH;
SUBR(MKTREE)LEVEL
BEGIN MKTREE;---------------------------------------------------
	SKIPN ENEST↔POP1J
;PLACE POLYGONS OF THIS LEVEL IN THE TREE AND IN THE SKY.
	LAC 1,ARG1↔SON 1,1↔DAC 1,PG0#↔DAC 1,POLYGON
L1:	CALL(INTREE,POLYGON)
	LAC 1,POLYGON
	CCW 1,1
	DAC 1,POLYGON
	CAME 1,PG0↔GO L1
	POP1J
BEND MKTREE; BGB 19 DECEMBER 1972 --------------------------------

SUBR(ATTACH)P1,P2-----------------------------------------------
BEGIN ATTACH;PLACE P1 WITHIN P2 - BGB - 23 JANUARY 1973.
	LAC 1,ARG2↔LAC 2,ARG1
	EXO. 2,1↔ENDO 3,2	;EXO(P1)←P2;P3←ENDO(P);
	JUMPN 3,.+5		;IF P3=0 THEN BEGIN
	ENDO. 1,2↔PGON. 1,1	;ENDO(P2)←NGON(P1)←PGON(P1)←P1;
	NGON. 1,1↔POP2J		;RETURN;END;
	NGON 4,3		;P4←NGON(P3);
	PGON. 1,4↔NGON. 1,3	;PGON(P4)←NGON(P3)←P1;
	NGON. 4,1↔PGON. 3,1	;NGON(P1)←P4;PGON(P1)←P3;
	POP2J
BEND;1/23/73------------------------------------------------------

SUBR(DETACH)P1--------------------------------------------------
BEGIN DETACH;REMOVE P1 FROM THE TREE - BGB - 23 JANUARY 1973.
	LAC 1,ARG1
	NGON 2,1↔PGON 3,1	;P2←NGON(P1);P3←PGON(P1);
	PGON. 3,2↔NGON. 2,3	;PGON(P2)←P3;NGON(P3)←P2;
	NGON. 1,1↔PGON. 1,1	;NGON(P1)←PGON(P1)←P1;
	CAMN 3,1↔SETZ 3,	;IF P3=P1 THEN P3←NIL;
	EXO 2,1↔ENDO 0,2	;P2←EXO(P1);P0←ENDO(P2);
	CAMN 0,1↔ENDO. 3,2	;IF P0=P1 THEN ENDO(P2)←P3;
	POP1J
BEND;1/23/73------------------------------------------------------
SUBR(INTREE)P1.		NESTING: PUT POLYGON INTO THE TREE.
BEGIN INTREE;-----------------------------------------------------

	ACCUMULATORS{R,C,E,LST,P0,P1,P2,P3}
	LAC P1,ARG1
	SON E,P1↔JUMPE E,POP1J.
	ROW R,(E)↔ADDI R,40↔LSH R,-6
	COL C,(E)↔ADDI C,40↔LSH C,-6
	TESTZ P1,HOLBIT↔SOS C

;FIND THE VERTICAL EDGE DUE EAST OF HERE.
L0:	XCT GETSKY(R)↔SKIPN 1↔SOJA C,L0
	ANDCMI 1,%↔DAD P2,1↔CAMN P2,P1↔SOJA C,L0

;PLACE P1 WITHIN P2, IN THE TREE AND IN THE SKY.
	TEST  1,SOUBIT↔EXO P2,P2
	CALL(ATTACH,P1,P2)
	CALL(INSKY,P1)

;CONS UP LIST OF P2'S ENDO POLYGONS.
	LAC P1,ARG1↔HRLOI LST,0			;LIST ← NIL.
	EXO P2,P1↔ENDO P3,P2↔JUMPE P3,POP1J.	;AIN'T NONE.
	DAC P3,P0
L1:	CAMN P3,P1↔GO L2
	PTIME. LST,P3↔LAC LST,P3		;CONS P3 TO LIST.
L2:	NGON P3,P3↔CAME P3,P0↔GO L1		;CDR THE RING.

;			NESTING: INTREE CONTINUED.
;SCAN LIST FOR P1 ENDO POLYGONS. P2←CDR(LIST).
L3:	CAIN LST,-1↔SETZ LST,
	SKIPN P2,LST↔POP1J↔SON E,P2
	ROW R,E↔ADDI R,40↔LSH R,-6
	COL C,E↔ADDI C,40↔LSH C,-6

;SCAN FOR FIRST POLYGON TO THE EAST OF P2.
L4:	JUMPL C,L7
	XCT GETSKY(R)↔SKIPN 1↔SOJA C,L4
	TRNE 1,%↔GO[TRC 1,%
	DAD P3,1↔CAMN P3,LST↔GO L7↔GO .+4]
	DAD P3,1↔CAMN P3,LST↔SOJA C,L4
	TESTZ 1,SOUBIT↔GO L5			;SKIP ON BRO. GO ON DAD.

;IF BROTHER IS NOT ON THE P-LIST THEN EXO(P3) IS VALID.
L4A:	LAC P0,P3↔EXO P3,P3
	PTIME 0,P0↔JUMPE 0,L5
;IF BROTHER IS ON P-LIST THEN EXO(P3) IS NOT YET VALID AND MUST
;BE SAVED ON AN N-LIST.
	NTIME 0,P0↔NTIME. 0,P2
	NTIME. P2,P0↔GO L6

;CHECK FOR P1 CAPTURE OF P2. P3 IS THE SKY-EXO(P2).
L5:	EXO 0,P2
	CAMN 0,P3↔GO L6		;EXO(P2)=SKYEXO(P2).
	CALL(DETACH,P2)
	CALL(ATTACH,P2,P1)

;CAPTURE OLDER BROTHER OFF THE N-LIST OF P2.
L6:	LAC 1,P2↔SETZ
	NTIME P2,P2
	NTIME. 0,1
	JUMPN P2,L5

;CDR THE P-LIST OF POTENTIAL ENDO POLYGONS.
L7:	LAC 1,LST↔SETZ
	PTIME LST,LST↔PTIME. 0,1
	GO L3
BEND INTREE; BGB 23 JANUARY 1973 ---------------------------------
SUBR(INSKY)PGON		NESTING: PUT A POLYGON IN THE SKY ARRAY.
BEGIN INSKY;------------------------------------------------------

	ACCUMULATORS{R,C,R2,C2,E,E2}

DEFINE ADVANCE{
	LAC E,E2↔LAC R,R2↔LAC C,C2
	CCW E2,E2
	ROW R2,E2↔ADDI R2,40↔LSH R2,-6
	COL C2,E2↔ADDI C2,40↔LSH C2,-6}

;XWD HORIZONTAL,,VERTICAL.
	LAC 1,ARG1↔SON E,1
	DAC E,E0#↔JUMPE E,POP1J.
	CW E2,E↔ADVANCE↔ADVANCE↔GO S1

;SOUTH ↓ BOUND.
S0:	CAMN E,E0↔POP1J
S1:	LAC E↔XCT GETSKY(R)
	SKIPE 1↔TRC %↔XCT PUTSKY(R)
	CAIE R2,(R)1↔AOJA R,S1↔ADVANCE
	TEST E,EASBIT↔GO W0↔GO EE0

;NORTH ↑ BOUND.
N0:	SOS R
N1:	LAC E↔XCT GETSKY(R)
	SKIPE 1↔TRC %↔XCT PUTSKY(R)
	CAME R,R2↔SOJA R,N1↔ADVANCE
	TEST E,EASBIT↔GO W0↔GO EE0

;EAST → BOUND.
EE0:	ADVANCE
	TEST E,NORBIT↔GO S0↔GO N0

;WEST ← BOUND.
W0:	ADVANCE
	TEST E,NORBIT↔GO S0↔GO N0

BEND INSKY;BGB 7 DECEMBER 1972 -----------------------------------
SUBR(KILVIC)LEVEL.	KILL: CONTOURS OF THE PREVIOUS LEVEL.
BEGIN KILVIC;-----------------------------------------------------
	ACCUMULATORS{PG,E0,E1,E2,PG0}
	SKIPN ESMOO↔POP1J
	LAC 1,ARG1↔CW 1,1
	SON PG,1
	SKIPN PG0,PG↔POP1J

;RELEASE VIC NODES OF THE POLYGON.
L1:	SON E0,PG
	TESTZ E0,ARCBIT↔GO L3
	ARC 0,PG↔SON. 0,PG
	SETZ↔ARC. 0,PG
	LAC  E1,E0
L2:	CCW  E2,E1
	SETZ↔SON 1,E1↔SKIPE 1↔SON. 0,1
	CALL(KLNODE,E1)
	CAMN E2,E0↔GO L3
	LAC  E1,E2↔GO L2

;ADVANCE TO NEXT POLYGON ON THIS LEVEL.
L3:	CCW PG,PG
	CAME PG,PG0↔GO L1
	POP1J

BEND KILVIC; BGB 5 JANUARY 1973 ----------------------------------
SUBR(KLBABY)LEVEL	KILL: BABY POLYGONS OF A LEVEL.
BEGIN KLBABY;-----------------------------------------------------
	ACCUMULATORS{A,PG,E0,E1,E2,Q,R}
	LAC 1,ARG1↔SON PG,1↔DAC PG,PG0#
;KLUDGE - SPARE SON POLYGON UNTIL WE CAN THINK OF A POLICY.
	GO L3

;ELIMINATE INSIGNIFICANT CONTOURS - SMALL LOW CONTRAST.
L1:	NCNT 0,PG↔LACM
	CAIL =10↔GO L3

;RELEASE VIC NODES OF THE POLYGON.
	SON E0,PG
	LAC  E1,E0
L2:	CCW  E2,E1
	CALL(KLNODE,E1)
	CAMN E2,E0↔GO .+3
	LAC  E1,E2↔GO L2

;KILL A BABY POLYGON.
	CAR Q,(PG)↔CDR R,(PG)
	DIP Q,(R)↔ DAP R,(Q)	;RINGO PG.
	CALL(KLNODE,PG)
	SKIPA PG,R		;CCW FROM OUT OF THE GRAVE.

;ADVANCE TO NEXT POLYGON ON THIS LEVEL.
L3:	CCW PG,PG↔CAME PG,PG0↔GO L1
	POP1J

BEND;1/6/73------------------------------------------------------
SUBR(KLPGON)PGN		KILL: POLYGON AND RETURN CCW(PGN).
BEGIN KLPGON;-----------------------------------------------------
	ACCUMULATORS{PG,E0,E1,E2,Q,R}
	LAC PG,ARG1

;RELEASE VIC NODES OF THE POLYGON.

	SON E0,PG
	LAC  E1,E0
L1:	CCW  E2,E1
	CALL(KLNODE,E1)
	CAMN E2,E0↔GO .+3
	LAC  E1,E2↔GO L1

;RING OUT & KILL POLYGON NODE,

	NGON Q,PG↔PGON R,PG↔JUMPE R,L2
	NGON. Q,R↔PGON. R,Q↔CAMN PG,R↔SETZ R,
	EXO 1,PG↔JUMPE 1,.+4↔ENDO 0,1↔CAMN 0,PG↔ENDO. R,1
	ENDO 1,PG↔SKIPE 1↔ZIP 3(1) ;MY ENDO BECOMES AN ORPHAN.

L2:	CAR Q,(PG)↔CDR R,(PG)
	DIP Q,(R)↔ DAP R,(Q)	;RINGO PG.
	CALL(KLNODE,PG)

;DOES DAD NEED A NEW FIRST SON.

	DAD 1,R
	CAMN PG,R↔SETZ R,
	SON 0,1↔CAMN 0,PG↔SON. R,1

;RETURN PGON CCW FROM OUT OF THE GRAVE.
	LAC 1,R
	POP1J

BEND KLPGON;BGB 1 JANUARY 1973 ----------------------------------
SUBR(SMOOTH)LEVEL	SMOOTH: CONTOURS INTO ARCS.
BEGIN SMOOTH;-----------------------------------------------------

	ACCUMULATORS{V1,V2,PG,E0,E1,E2}
	SKIPN ESMOO↔POP1J
	LAC 1,ARG1
	SON PG,1↔SKIPN PG↔POP1J

;POLYGON INITIALIZATION.

L1:	DAC PG,PGSAVE#
	SON V1,PG↔DAC V1,E0SAVE#   ;UPPER MOST LEFT VERTEX.
	ARC V2,PG		   ;LOWER MOST RIGHT VERTEX.
	TESTZ V2,ARCBIT↔POP1J	   ;END OF LEVEL'S POLYGON RING.

;CREATE ARC NODES AT POLYGON'S EXTREME CORNERS.

	SETQ(ARC2,{MKNODE,[VBIT+ARCBIT+VREL]})
	LAC RC(V2)↔DAC RC(1)↔SON. 1,V2↔SON. V2,1
	SETQ(ARC1,{MKNODE,[VBIT+ARCBIT+VREL]})
	LAC RC(V1)↔DAC RC(1)↔SON. 1,V1↔SON. V1,1

	LAC 2,ARC2↔CCW. 1,2↔CW. 1,2↔CCW. 2,1↔CW. 2,1
	DAD. PG,1↔DAD. PG,2↔ARC. 1,PG

;CALL FOR CREATION OF THE INTERMEDIATE ARC NODES.
	DZM AVCNT
	CALL(MKARCS,ARC1,ARC2)
	CALL(MKARCS,ARC2,ARC1)

;KILL TWO-SIDED ARC-POLYGONS AND ADVANCE TO NEXT POLYGON.
	SKIPN AVCNT↔GO[
L2:		CALL(KLNODE,ARC1)
		CALL(KLNODE,ARC2)
		SETQ(PG,{KLPGON,PGSAVE})
		JUMPN PG,L1↔POP1J]
	LAC PG,PGSAVE↔CCW PG,PG↔GO L1

	LIT
	DECLARE{ARC1,ARC2}
BEND SMOOTH; BGB 6 DECEMBER 1972 ---------------------------------

	DECLARE{AVCNT}	;ARC-VERTEX COUNT.
;MKARCS(V1,V2).		SMOOTH: MAKE ARCS FROM V1 CCW TO V2.
SUBR(MKARCS)V1,V2-------------------------------------------------
BEGIN MKARCS
	ACCUMULATORS{D,U1,U2,V1,V2,A,B,C,U,V}
	LAC V1,ARG2↔LAC V2,ARG1
;CHECK FOR TRIVAIL CASE.
L0:	SON U1,V1↔SON U2,V2

;COMPUTE NORMALIZED ARC EDGE COEFFICIENTS.
	ROW A,V1↔FLO A,		; A ← Y1.
	COL B,V2↔FLO B,		; B ← X2.
	COL C,V1↔FLO C,		; C ← X1.
	ROW D,V2↔FLO D,		; D ← Y2.
	LAC 1,B↔FMPR 1,A	; 1 ← X2*Y1.
	FSBR A,D↔FSBR B,C	; A ← Y1-Y2.   B ← X2-X1.
	FMPR C,D↔FSBR C,1	; C ← X1*Y2 - X2*Y1.
	LAC 0,A↔FMPR 0,0↔LAC 1,B↔FMPR 1,1↔FADR 1,0
	CALL SQRT,1↔FDVR A,1↔FDVR B,1↔FDVR C,1
	LACM 0,A↔HLLM 0,6(V1)
	LACM 0,B↔HLRM 0,6(V1)

;SET 'EM UP FOR AN ARC PASS.
	SON U1,V1↔SON U2,V2
	CCW 0,U1↔CAMN 0,U2↔GO L3
	DZM DMAX#↔DZM DMIN#
	DZM VMAX#↔DZM VMIN#↔DZM MAXCON#
;GO FROM U1 CCW TO U2 AND FIND THE U FURTHEST OFF THE ARC-EDGE.
L1:	CCW U1,U1↔CAMN U1,U2↔GO L2
	COL 0,U1↔FLO 0,↔ROW 1,U1↔FLO 1,
	FMPR 0,A↔FMPR 1,B↔LAC D,C↔FADR D,0↔FADR D,1
	CAMGE D,DMIN↔GO [DAC U1,VMIN↔DAC D,DMIN↔GO .+1]
	CAMLE D,DMAX↔GO [DAC U1,VMAX↔DAC D,DMAX↔GO .+1]
;KEEP TRACK OF MAXIMUM EDGE CONTRAST ALONG ARC.
	CNTRST 0,V1↔MOVM↔CAMLE MAXCON↔DAC MAXCON↔GO L1

;WHEN EXTREMA EXCEED ARCWID[MAXCON] THEN FORM ARC-POINTS.
L2:	LAC U,VMIN↔LACM DMIN
	CAMGE DMAX↔LAC U,VMAX
	CAMGE DMAX↔LAC DMAX
	LAC 1,MAXCON↔CAMGE ARCWID(1)↔GO L3
;OLDE ESPLIT.
	SETQ(V,{MKNODE,[VBIT+ARCBIT+VREL]})↔AOS AVCNT
	SON. U,V↔SON. V,U
	LAC RC(U)↔DAC RC(V)↔DAD 0,U↔DAD. 0,V
	CCW. V,V1↔CW. V1,V
	CCW. V2,V↔CW. V,V2
	LAC V2,V↔GO L0
;ADVANCE CCW AN ARC-EDGE OR EXIT.
L3:	CAMN V2,ARG1↔POP2J
	LAC V1,V2↔CCW V2,V2↔GO L0
BEND MKARCS; BGB 28 DECEMBER 1972 --------------------------------
SUBR(HISTOG)		MISC: MAKE HISTOGRAM OF TVBUF.
BEGIN HISTOG;--------------------------------------------------
	SKIPE FLGHIS↔POP0J↔SETOM FLGHIS
	LAC[XWD HISTO,HISTO+1]
	DZM HISTO↔BLT HISTO+77
	LAC 7,[XWD L,0]↔BLT 7,6↔GO 2

;ACCUMULATOR LOOP.
L:	=62208		;0
	0		;1
	ILDB 1,6	;2
	AOS HISTO(1)	;3
	SOJG 0,2	;4
	POP0J		;5
	POINT 6,TVBUF,-1;6

BEND HISTOG; BGB 4 DECEMBER 1972 ---------------------------------
END